package com.example.demo.leetcode100题;

import com.example.demo.StopWatchTemplate;

/**
 * @author：zzc
 * @date: 2022/9/1
 */
public class 环形链表 {

    //给定个链表，判断链表中是否有环。
    //如果链表中有某个节点，可以通过连续跟踪 next 指针再次到达，则链表中
    //存在环。 为了表示给定链表中的环，我们使用整数 pos 来表示链表尾连接到链
    //表中的位置（索引从 0 开始）。 如果 pos 是 -1，则在该链表中没有环。注意：
    //pos 不作为参数进行传递，仅仅是为了标识链表的实际情况。
    //如果链表中存在环，则返回 true 。 否则，返回 false 。
    //进阶：你能用 O(1)内存解决此问题吗？
    //示例 1：
    //输入：head = [3,2,0,-4], pos = 1
    //输出：返回索引为 1 的链表节点
    //解释：链表中有一个环，其尾部连接到第二个节点。

    //输入：head = [1,2], pos = 0
    //输出：返回索引为 0 的链表节点
    //解释：链表中有一个环，其尾部连接到第一个节点。
    //示例 3：
    //输入：head = [1], pos = -1
    //输出：返回 null
    //解释：链表中没有环。
    //提示：
    //链表中节点的数目范围在范围 [0, 104
    //] 内
    //-105 <= Node.val <= 105
    //pos 的值为 -1 或者链表中的一个有效索引

    public static void main(String[] args) {
        ListNode node1 = new ListNode(1);
        node1.next = new ListNode(2);
        node1.next.next = new ListNode(2);
        node1.next.next.next = new ListNode(1);
        System.out.println(StopWatchTemplate.doSupplier(() -> hasCycle(node1)));
    }

    private static boolean hasCycle(ListNode head) {
        if (head == null) {
            return false;
        }
        ListNode slowPtr = head, fastPtr = head;
        while (fastPtr.next != null && fastPtr.next.next != null) {
            slowPtr = slowPtr.next;
            fastPtr = fastPtr.next.next;
            if (slowPtr == fastPtr) {
                return true;
            }
        }
        return false;
    }
}
